#include "network.h"

NetWork* nopen(int type,const char* ip,in_port_t port,bool issvr)
{
	NetWork* nw = malloc(sizeof(NetWork));
	if(NULL == nw)
	{
		error("malloc");
		return NULL;
	}

	nw->fd = socket(AF_INET,type,0);
	if(0 > nw->fd)
	{
		error("socket");
		free(nw);
		return NULL;
	}

	nw->type = type;
	nw->len = sizeof(nw->addr);
	nw->addr.sin_family = AF_INET;
	nw->addr.sin_port = htons(port);
	nw->addr.sin_addr.s_addr = inet_addr(ip);

	if(issvr)
	{
		if(bind(nw->fd,(SP)&nw->addr,nw->len))
		{
			error("bind");
			free(nw);
			return NULL;
		}

		if(SOCK_STREAM == type && listen(nw->fd,MAX_LISTEN))
		{
			error("listen");
			free(nw);
			return NULL;
		}
	}
	else if(SOCK_STREAM == type)
	{
		if(connect(nw->fd,(SP)&nw->addr,nw->len))
		{
			error("connect");
			free(nw);
			return NULL;
		}
	}

	return nw;
}

// 用于接收客户端连接，TCP服务端专用
NetWork* naccept(NetWork* svrnw)
{
	if(SOCK_STREAM != svrnw->type)
	{
		puts("NetWork type error!!!");
		return NULL;
	}

	NetWork* clinw = malloc(sizeof(NetWork));
	if(NULL == clinw)
	{
		error("malloc");
		return NULL;
	}

	clinw->type = SOCK_STREAM;
	clinw->len = sizeof(clinw->addr);
	clinw->fd = accept(svrnw->fd,(SP)&clinw->addr,&clinw->len);
	if(0 > clinw->fd)
	{
		error("accept");
		free(clinw);
		return NULL;
	}

	return clinw;
}

// UDP和TCP通用的数据发送函数
int nsend(NetWork* nw,const void* buf,size_t len)
{
	if(SOCK_STREAM == nw->type)
	{
		return send(nw->fd,buf,len,0);
	}
	else if(SOCK_DGRAM == nw->type)
	{
		return sendto(nw->fd,buf,len,0,(SP)&nw->addr,nw->len);
	}

	return -1;
}

// UDP和TCP通用的数据接收函数
int nrecv(NetWork* nw,void* buf,size_t len)
{
	if(SOCK_STREAM == nw->type)
	{
		return recv(nw->fd,buf,len,0);
	}
	else if(SOCK_DGRAM == nw->type)
	{
		return recvfrom(nw->fd,buf,len,0,(SP)&nw->addr,&nw->len);
	}

	return -1;

}

// 关闭socket并释放NetWork
void nclose(NetWork* nw)
{
	if(close(nw->fd))
	{
		error("close");
	}

	free(nw);
}

